5.5. GCC-4.8.2 - Pass 1

El paquete GCC contiene la colección de compiladores GNU, que incluye los compiladores C y C++ .

Espacio requerido en disco estimado de construcción: 5.5 SBU
Espacio requerido en disco: 1.4 GB

5.5.1. Instalación de Cross GCC

GCC ahora requiere de los paquetes de GMP, MPFR y MPC . Aunque estos paquetes pueden no estar incluidos en tu distribución , sin embargo se construirán con GCC . Desempaqueta cada paquete en el directorio sources del CCG y cambia el nombre de los directorios resultantes de manera que los procedimientos de compilación de GCC los utilizará automáticamente:

[Note]

Nota

Hay malentendidos frecuentes sobre este capítulo. Los procedimientos son los mismos que cualquier otro capítulo como se explicó anteriormente ( instrucciones de construcción de Paquetes) . En primer lugar extrae el paquete gcc desde el directorio de fuentes y cambia al directorio creado . Sólo entonces se debe proceder con las siguientes instrucciones.

tar -Jxf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -Jxf ../gmp-5.1.3.tar.xz
mv -v gmp-5.1.3 gmp
tar -zxf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc

El siguiente comando cambiará la localización del enlazador dinámico de GCC para usar la instalada en /tools. También elimina /usr/include de GCC de la ruta de búsqueda . Edición :

for file in \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

Como esto último parece difícil de seguir , vamos a romper un poco . En primer lugar nos encontramos con todos los archivos del directorio gcc/config que se llaman linux.h, linux64.h o sysv4.h . Para cada archivo encontrado , lo copiamos a un archivo con el mismo nombre pero con un sufijo añadido de ".orig " . A continuación, la primera expresión de sed antepone "/tools" a todas las instancias de "/lib/ld", "/lib64/ld " o "/lib32/ld" , mientras que la segunda expresión de sed reemplaza casos no modificables de "/usr" . A continuación, añadimos nuestros estados definidos que alteran el prefijo del fichero de arranque predeterminado al final del archivo . Tenga en cuenta que el camino "/" se requiere en "/tools/lib/". Por último , utilizamos touch para actualizar la marca de Espacio requerido en disco de los archivos copiados. Cuando se utiliza junto con cp -u , esto impide que se realicen cambios inesperados en los archivos originales en caso de que los comandos se ejecuten inadvertidamente dos veces.

GCC no detecta correctamente la protección, lo que provoca problemas para la construcción de Glibc- 2.19 , así que arreglaremos eso emitiendo el siguiente comando:

sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure

La documentación de GCC recomienda construirlo fuera del directorio de fuentes, en un directorio de construcción dedicado:

mkdir -v ../gcc-build
cd ../gcc-build

Prepara GCC para su compilación:

../gcc-4.8.2/configure                               \
    --target=$LFS_TGT                                \
    --prefix=/tools                                  \
    --with-sysroot=$LFS                              \
    --with-newlib                                    \
    --without-headers                                \
    --with-local-prefix=/tools                       \
    --with-native-system-header-dir=/tools/include   \
    --disable-nls                                    \
    --disable-shared                                 \
    --disable-multilib                               \
    --disable-decimal-float                          \
    --disable-threads                                \
    --disable-libatomic                              \
    --disable-libgomp                                \
    --disable-libitm                                 \
    --disable-libmudflap                             \
    --disable-libquadmath                            \
    --disable-libsanitizer                           \
    --disable-libssp                                 \
    --disable-libstdc++-v3                           \
    --enable-languages=c,c++                         \
    --with-mpfr-include=$(pwd)/../gcc-4.8.2/mpfr/src \
    --with-mpfr-lib=$(pwd)/mpfr/src/.libs

El significado de las opciones de configure :

--with-newlib

Como una librería C de trabajo aún no está disponible , esto garantiza que la constante inhibit_libc se defina en la construcción libgcc . Esto evita la compilación de cualquier código que requiera el soporte de libc .

--without-headers

Al crear un compilador cruzado completo, GCC requiere cabeceras estándar compatibles con el sistema de destino. Para nuestros propósitos , no serán necesarias estas cabeceras . Esta opción evita que GCC las busque.

--with-local-prefix=/tools

El prefijo local es la ubicación en el sistema en la que GCC buscará para localizar archivos incluidos instalados . El valor por defecto es /usr/local . Fijar esto a /tools ayuda a mantener la ubicación de host de /usr/local fuera de la ruta de búsqueda de GCC .

--with-native-system-header-dir=/tools/include

Por defecto GCC busca /usr/include para las cabeceras del sistema. En conjunción con el interruptor sysroot , esto se traduciría normalmente a $LFS/usr/include . Sin embargo, los encabezados que se instalarán en las dos secciones siguientes se destinarán a $ LFS/tools/include . Esta opción nos asegura que gcc las encontrará correctamente. En la segunda fase de GCC , este mismo interruptor se asegurará de que no se encuentren cabeceras del sistema anfitrión.

--disable-shared

Esto fuerza a CCG a vincular sus librerías internas estáticamente . Hacemos esto para evitar posibles problemas con el sistema host.

--disable-decimal-float, --disable-threads, --disable-libatomic, --disable-libgomp, --disable-libitm, --disable-libmudflap, --disable-libquadmath, --disable-libsanitizer, --disable-libssp, --disable-libstdc++-v3

Estos interruptores desactivan el soporte para la extensión de punto decimal flotante, threading,libatomic, libgomp, libitm, libmudflap, libquadmath, libsanitizer, libssp y la librería estándar C++ respectivamente. Estas funciones no se compilan cuando se construye un compilador cruzado y no son necesarias para la tarea de compilación cruzada de libc temporal.

--disable-multilib

En sistemas x86_64 LFS todavía no admite una configuración multilib. Este interruptor es inofensivo para x86.

--enable-languages=c,c++

Esta opción garantiza que sólo el C y compiladores C ++ se construyan. Estos son los únicos lenguajes necesarios ahora.

--with-mpfr-*

Estas opciones permiten que el sistema de construcción utilice correctamente la copia en el árbol de las fuentes MPFR.

Compila GCC ejecutando:

make

La compilación está completa. Es en este punto que el conjunto de pruebas de verificación normalmente se ejecuta, pero, como se mencionó antes, el entorno de prueba aún no está en su lugar. Los beneficios de ejecutar las pruebas en este momento son mínimos, pues pronto serán sustituidos los programas de esta primera fase.

Instala el paquete:

make install

Usar - disable-shared hace que el archivo libgcc_eh.a no se cree ni se instale. El paquete Glibc depende de esta librería, ya que utiliza -lgcc_eh dentro de su sistema de construcción. Esta dependencia puede ser satisfecha mediante la creación de un enlace simbólico a libgcc.a, ya que el archivo va a terminar conteniendo los objetos que normalmente figuran en libgcc_eh.a:

ln -sv libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`

Los detalles sobre este paquete se encuentran en la Sección 6.17.2, "Contenido de GCC".